package cn.blnp.net.flowable.api.history;

import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.*;
import org.flowable.identitylink.api.history.HistoricIdentityLink;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.flowable.task.service.history.NativeHistoricTaskInstanceQuery;
import org.flowable.variable.api.history.NativeHistoricVariableInstanceQuery;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

/**
 * <h3>历史服务API演示案例</h3>
 *
 * @author <a href="mailto:blnp.yibin@qq.com">lyb</a>
 * @version 1.0
 * @since 2025/4/29 15:27
 */
@Slf4j
@SpringBootTest
public class HistoryApiTest {

    @Resource
    private RepositoryService repositoryService;
    @Resource
    private RuntimeService runtimeService;
    @Resource
    private TaskService taskService;
    @Resource
    private HistoryService historyService;

    /**
     *  <p>
     *      历史服务接口HistoryService主要提供历史数据的查询、删除等服务，即提供与名称以ACT_HI_开头的相关的数据表服务。通过该服务接口可以查询历史流程实例、
     *  历史活动、历史任务、历史流程变量，以及删除历史流程实例、历史任务实例等。
     *  </p>
     *  <hr/>
     *  <ul>
     *      <li>创建历史流程实例、历史活动实例、历史任务实例、历史详情、历史变量等对象的查询；</li>
     *      <li>创建历史流程实例、历史活动实例、历史任务实例、历史详情、历史变量等对象的原生查询，支持传入SQL；</li>
     *      <li>删除历史流程实例、历史任务实例；</li>
     *      <li>查询与历史流程实例、任务实例关联的用户。</li>
     *  </ul>
     */

    /**
     * <p><b>用途:用例演示<b></p>
     * @author <a href="mailto:blnp.yibin@qq.com">lyb</a>
     * @since 17:35 2025/4/29
     * @params []
     * @param
     * @return void
    **/
    @Test
    public void test() {
        /**
         *  API 用途说明：
         **/
        //创建历史流程实例查询
        //HistoricProcessInstanceQuery createHistoricProcessInstanceQuery();

        //创建历史活动实例查询
        //HistoricActivityInstanceQuery createHistoricActivityInstanceQuery();

        //创建历史任务实例查询
        //HistoricTaskInstanceQuery createHistoricTaskInstanceQuery();

        //创建历史详情查询
        //HistoricDetailQuery createHistoricDetailQuery();

        //创建历史变量查询
        //HistoricVariableInstanceQuery createHistoricVariableInstanceQuery();

        //查询流程实例历史日志
        //ProcessInstanceHistoryLogQuery createProcessInstanceHistoryLogQuery(String processInstanceId);

        /*****创建原生查询，可以通过传入SQL进行检索*****/

        //创建通过SQL直接查询历史流程实例的对象
        //NativeHistoricProcessInstanceQuery createNativeHistoricProcessInstanceQuery();

        //创建通过SQL直接查询历史活动实例的对象
        //NativeHistoricActivityInstanceQuery createNativeHistoricActivityInstanceQuery();

        //创建通过SQL直接查询历史任务实例的对象
        //NativeHistoricTaskInstanceQuery createNativeHistoricTaskInstanceQuery();

        //创建通过SQL直接查询历史详情的对象
        //NativeHistoricDetailQuery createNativeHistoricDetailQuery();

        //创建通过SQL直接查询历史变量的对象
        //NativeHistoricVariableInstanceQuery createNativeHistoricVariableInstanceQuery();

        //删除历史任务实例
        //void deleteHistoricTaskInstance(String taskId);

        //删除历史流程实例
        //void deleteHistoricProcessInstance(String processInstanceId);

        //查询与任务实例关联的用户
        //List<HistoricIdentityLink> getHistoricIdentityLinksForTask(String taskId);

        //查询与流程实例关联的用户
        //List<HistoricIdentityLink> getHistoricIdentityLinksForProcessInstance(String processInstanceId);

        //查询历史流程实例
        List<HistoricProcessInstance> hisProcInsts = historyService
                .createNativeHistoricProcessInstanceQuery()
                .sql("select * from ACT_HI_PROCINST where BUSINESS_KEY_ like concat(#{prefix}, '%')")
                .parameter("prefix", "businessKeyPrefix")
                .list();
        for (HistoricProcessInstance hisProcInst : hisProcInsts) {
            log.info("流程实例ID为：{}，业务主键：{}，创建时间：{}", hisProcInst.getId(),
                    hisProcInst.getBusinessKey(),
                    DateUtil.formatDateTime(hisProcInst.getStartTime())
            );
        }
    }
}
